%-----------------------------------------------------
% Dispositivos Semiconductores 66.25/86.03
% TP 1 - Curvas características del transistor MOSFET
% Alumnos:
% 	*
%	* 91523 Vazquez, Matias Fernando
%-----------------------------------------------------


function PgraficarVg(directorio)

% CONSTANTES

V=-5:0.1:0;
I=-5:0.1:0;

%---------- INGRESO DE DATOS ------------------------

simulacion1 = dlmread(strcat(directorio, 'simulacion.txt'),'\t',1,0);
medicion1 = dlmread(strcat(directorio, 'medicion1.txt'),'\t',1,0);
medicion2 = dlmread(strcat(directorio, 'medicion2.txt'),'\t',1,0);
medicion3 = dlmread(strcat(directorio, 'medicion3.txt'),'\t',1,0);
medicion4 = dlmread(strcat(directorio, 'medicion4.txt'),'\t',1,0);
medicion5 = dlmread(strcat(directorio, 'medicion5.txt'),'\t',1,0);
simulacion2 = dlmread(strcat(directorio, 'simulacion2.txt'),'\t',1,0);
% '\t'="TAB"; como la primer fila es el encabezado, se omite esta fila en la lectura
simulacion1(:,2)=simulacion1(:,2)*1000;	% Normalización a mA
simulacion2(:,2)=simulacion2(:,2)*1000;

%---------- AJUSTES ---------------------------------

rsimulacion1 =simulacion1;					% Se inicializa una nueva matriz
rsimulacion1(:,2)=sqrt(-rsimulacion1(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)
Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rsimulacion1(1:36,:)');	% Param es un vector donde el primer elemento es A y el segundo B

k_spice_simulacion1=(Param(1)^2)/1000																				% Es fundamental transponer la matriz para que fminsearch funcione
ksimulacion1=Param(1)^2	% mA/V^2
VTsimulacion1=-Param(2)/Param(1)


rmedicion1 = medicion1;					% Se inicializa una nueva matriz
rmedicion1(:,2)=sqrt(-rmedicion1(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)

Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rmedicion1(1:13,:)');	% Param es un vector donde el primer elemento es A y el segundo B						

k_spice_medicion1=(Param(1)^2)*2/1000   % A/V^2
kmedicion1=Param(1)^2
VTmedicion1=-Param(2)/Param(1)


rmedicion2 = medicion2;					% Se inicializa una nueva matriz
rmedicion2(:,2)=sqrt(-rmedicion2(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)

Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rmedicion2(1:13,:)');	% Param es un vector donde el primer elemento es A y el segundo B
																				% Es fundamental transponer la matriz para que fminsearch funcione
k_spice_medicion2=(Param(1)^2)*2/1000   % A/V^2
kmedicion2=Param(1)^2	% mA/V^2
VTmedicion2=-Param(2)/Param(1)


rmedicion3 = medicion3;					% Se inicializa una nueva matriz
rmedicion3(:,2)=sqrt(-rmedicion3(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)

Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rmedicion3(1:end-1,:)');	% Param es un vector donde el primer elemento es A y el segundo B
				
k_spice_medicion3=(Param(1)^2)*2/1000   % A/V^2
kmedicion3=Param(1)^2	% mA/V^2
VTmedicion3=-Param(2)/Param(1)



rmedicion4 = medicion4;					% Se inicializa una nueva matriz
rmedicion4(:,2)=sqrt(-rmedicion4(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)

Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rmedicion4(1:end-1,:)');	% Param es un vector donde el primer elemento es A y el segundo B
				
k_spice_medicion4=(Param(1)^2)*2/1000   % A/V^2
																				% Es fundamental transponer la matriz para que fminsearch funcione
kmedicion4=Param(1)^2	% mA/V^2
VTmedicion4=-Param(2)/Param(1)


rmedicion5 = medicion5;					% Se inicializa una nueva matriz
rmedicion5(:,2)=sqrt(-rmedicion5(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)

Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rmedicion5(1:end-1,:)');	% Param es un vector donde el primer elemento es A y el segundo B
				
k_spice_medicion5=(Param(1)^2)*2/1000   % A/V^2
																				% Es fundamental transponer la matriz para que fminsearch funcione
kmedicion5=Param(1)^2	% mA/V^2
VTmedicion5=-Param(2)/Param(1)


rsimulacion2 =simulacion2;					% Se inicializa una nueva matriz
rsimulacion2(:,2)=sqrt(-rsimulacion2(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)

Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rsimulacion2(1:36,:)');	% Param es un vector donde el primer elemento es A y el segundo B

k_spice_simulacion2=(Param(1)^2)*2/1000   % A/V^2
																				% Es fundamental transponer la matriz para que fminsearch funcione
ksimulacion2=Param(1)^2	% mA/V^2
VTsimulacion2=-Param(2)/Param(1)

%---------- GRAFICOS --------------------------------

% GRAFICOS DE LA RAIZ DE LA CORRIENTE

figure
hold on

plot(rsimulacion1(:,1),rsimulacion1(:,2),'bo','Markersize',5)
plot(V(1:37),sqrt(ksimulacion1)*(-V(1:37)+VTsimulacion1),'b-','Linewidth',2)

plot(rmedicion1(:,1),rmedicion1(:,2),'ro','Markersize',5)
plot(V(1:39),sqrt(kmedicion1)*(-V(1:39)+VTmedicion1),'r-','Linewidth',2)

plot(rmedicion2(:,1),rmedicion2(:,2),'go','Markersize',5)
plot(V(1:39),sqrt(kmedicion2)*(-V(1:39)+VTmedicion2),'g-','Linewidth',2)

plot(rmedicion3(:,1),rmedicion3(:,2),'co','Markersize',5)
plot(V(1:39),sqrt(kmedicion3)*(-V(1:39)+VTmedicion3),'c-','Linewidth',2)

plot(rmedicion4(:,1),rmedicion4(:,2),'mo','Markersize',5)
plot(V(1:39),sqrt(kmedicion4)*(-V(1:39)+VTmedicion4),'m-','Linewidth',2)

plot(rmedicion5(:,1),rmedicion5(:,2),'ko','Markersize',5)
plot(V(1:38),sqrt(kmedicion5)*(-V(1:38)+VTmedicion5),'k-','Linewidth',2)

plot(rsimulacion2(:,1),rsimulacion2(:,2),'yo','Markersize',5)
plot(V(1:39),sqrt(ksimulacion2)*(-V(1:39)+VTsimulacion2),'y-','Linewidth',2)


legend('simulacion CB4007', sprintf('ajuste con k = %f mA/V^2 y VT= %f V', ksimulacion1, VTsimulacion1), 
	   '1er transistor integrado 1', sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion1, VTmedicion1),
	   '2do transistor integrado 1',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion2, VTmedicion2),
	   '3er transistor integrado 1',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion3, VTmedicion3),
	   '1er transistor integrado 2',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion4, VTmedicion4),
	   '1er transistor integrado 3',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion5, VTmedicion5),
	   'modelo propio',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', ksimulacion2, VTsimulacion2),
	   'Location','Northeast')

%Estos comandos agregan rotulos y detalles a los graficos
xlabel('Tension V_{GS} [Volts]')
ylabel('Raiz Corriente raiz(I_D) [raiz(mA)]')
axis([-5 0 0 2.5])
grid minor

% Una vez generada la imagen, se imprime a un archivo (recordar "help print" para obtener ayuda con la funcion).
print('P_sqrtID_VG.png','-dpng');


% GRAFICOS DE LAS CURVAS
% Luego, se debe graficar la curva cuadrática.
figure
hold on
plot(simulacion1(:,1),simulacion1(:,2),'bo','Markersize',5)
plot(V(1:36),-ksimulacion1*(V(1:36)-VTsimulacion1).^2,'b-','Linewidth',2)

plot(medicion1(:,1),medicion1(:,2),'ro','Markersize',5)
plot(V(1:38),-kmedicion1*(V(1:38)-VTmedicion1).^2,'r-','Linewidth',2)

plot(medicion2(:,1),medicion2(:,2),'go','Markersize',5)
plot(V(1:38),-kmedicion2*(V(1:38)-VTmedicion2).^2,'g-','Linewidth',2)

plot(medicion3(:,1),medicion3(:,2),'co','Markersize',5)
plot(V(1:38),-kmedicion3*(V(1:38)-VTmedicion3).^2,'c-','Linewidth',2)

plot(medicion4(:,1),medicion4(:,2),'mo','Markersize',5)
plot(V(1:37),-kmedicion4*(V(1:37)-VTmedicion4).^2,'m-','Linewidth',2)

plot(medicion5(:,1),medicion5(:,2),'ko','Markersize',5)
plot(V(1:38),-kmedicion5*(V(1:38)-VTmedicion5).^2,'k-','Linewidth',2)

plot(simulacion2(:,1),simulacion2(:,2),'yo','Markersize',5)
plot(V(1:38),-ksimulacion2*(V(1:38)-VTsimulacion2).^2,'y-','Linewidth',2)


% Primero deben graficarse todoas las mediciones y simulaciones, luego los ajustes
legend('simulacion CB4007', sprintf('ajuste con k = %f mA/V^2 y VT= %f V', ksimulacion1, VTsimulacion1), 
	   '1er transistor integrado 1', sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion1, VTmedicion1),
	   '2do transistor integrado 1',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion2, VTmedicion2),
	   '3er transistor integrado 1',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion3, VTmedicion3),
	   '1er transistor integrado 2',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion4, VTmedicion4),
	   '1er transistor integrado 3',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion5, VTmedicion5),
	   'modelo propio',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', ksimulacion2, VTsimulacion2),
	   'Location','Southeast')
%legend(LEYENDA1,LEYENDA2,LEYENDA3,LEYENDA4,'Location','Northwest')

%Estos comandos agregan rotulos y detalles a los graficos
xlabel('Tension V_{GS} [Volts]')
ylabel('Corriente I_D [mA]')
grid minor

print('P_ID_VG.png','-dpng');


%---------------------------------------------------------------------------------------------------------------
% Grafico de la transconductancia gm calculada;
%  - A partir del cociente de diferencias
%  - A partir de gm=2*raiz(k*ID)
%---------------------------------------------------------------------------------------------------------------
% Para graficar las curvas TEORICAS, nos ayudamos de un vector auxiliar para las tensiones

% Calculamos gm como cociente de diferencias
gm_simulacion1=diff(simulacion1(:,2)/1000)./diff(simulacion1(:,1));
gm_simulacion2=diff(simulacion2(:,2)/1000)./diff(simulacion2(:,1));
gm_medicion1=diff(medicion1(:,2)/1000)./diff(medicion1(:,1));
gm_medicion2=diff(medicion2(:,2)/1000)./diff(medicion2(:,1));
gm_medicion3=diff(medicion3(:,2)/1000)./diff(medicion3(:,1));
gm_medicion4=diff(medicion4(:,2)/1000)./diff(medicion4(:,1));
gm_medicion5=diff(medicion5(:,2)/1000)./diff(medicion5(:,1));

figure
hold on
plot(simulacion1(2:end,2),gm_simulacion1,'bo','Markersize',5)
plot(I,2*sqrt(-ksimulacion1/1000*I/1000),'b-','Linewidth',2)		% /1000 es para normalizar las unidades de gm

plot(medicion1(2:end,2),gm_medicion1,'ro','Markersize',5)
plot(I,2*sqrt(-kmedicion1/1000*I/1000),'r-','Linewidth',2)

plot(medicion2(2:end,2),gm_medicion2,'go','Markersize',5)
plot(I,2*sqrt(-kmedicion2/1000*I/1000),'g-','Linewidth',2)

plot(medicion3(2:end,2),gm_medicion3,'co','Markersize',5)
plot(I,2*sqrt(-kmedicion3/1000*I/1000),'c-','Linewidth',2)

plot(medicion4(2:end,2),gm_medicion4,'mo','Markersize',5)
plot(I,2*sqrt(-kmedicion4/1000*I/1000),'m-','Linewidth',2)

plot(medicion5(2:end,2),gm_medicion5,'ko','Markersize',5)
plot(I,2*sqrt(-kmedicion5/1000*I/1000),'k-','Linewidth',2)

plot(simulacion2(2:end,2),gm_simulacion2,'yo','Markersize',5)
plot(I,2*sqrt(-ksimulacion2/1000*I/1000),'y-','Linewidth',2)		% /1000 es para normalizar las unidades de gm


legend('simulacion CB4007', sprintf('calculo teorico con k = %f mA/V^2', ksimulacion1), 
	   '1er transistor integrado 1', sprintf('calculo teorico con k = %f mA/V^2', kmedicion1),
	   '2do transistor integrado 1',sprintf('calculo teorico con k = %f mA/V^2', kmedicion2), 
	   '3er transistor integrado 1',sprintf('calculo teorico con k = %f mA/V^2', kmedicion3),
	   '1er transistor integrado 2',sprintf('calculo teorico con k = %f mA/V^2', kmedicion4),
	   '1er transistor integrado 3',sprintf('calculo teorico con k = %f mA/V^2', kmedicion5),
	   'modelo propio', sprintf('calculo teorico con k = %f ma/V^2', ksimulacion2),
	   'Location','Northeast')
	   
%-----------------------------------------------------
%Estos comandos agregan rotulos y detalles a los graficos
xlabel('Corriente I_D [mA]')
ylabel('g_m [Ohm^-^1]')
axis([-5 0 0 0.0045])
grid minor

print('P_GM_ID.png','-dpng');
